package values

import (
	"fmt"
	"math/rand"
)

type modifierTag int

const (
	ModifierAdd modifierTag = iota
	ModifierAddPer
	ModifierFinalAdd
	ModifierFinalAddPer
)

func (m modifierTag) String() string {
	switch m {
	case ModifierAdd:
		return "add"
	case ModifierAddPer:
		return "per"
	case ModifierFinalAdd:
		return "finalAdd"
	case ModifierFinalAddPer:
		return "finalPer"
	}
	return ""
}

type Modifier struct {
	*rand.Rand
	Tag    modifierTag // 标签, 上层通过标签来添加, 删除
	Source string      // 来源, 描述这个Modifier是为何添加到它的宿主
	Label  string      // 值的条件, 描述这个值为何起作用, 怎么算出来(就是对Cond或者是ValueFunc的描述)

	Params []int32 // 某个公式或者holder所需要的参数

	// 在ValueFunc为nil时起作用, holder是属性的持有者，formula是属性计算的公式
	Value int32
	Cond  func(holder interface{}, params []int32, formula Formula) bool
	// 每次在attr的SetFormula里面都会被重新计算
	ValueFunc func(holder interface{}, params []int32, formula Formula) (int32, error)
}

func (m *Modifier) String() string {
	s := fmt.Sprintf("%v", m.Value)
	if m.Source != "" {
		s = fmt.Sprintf("%v_%v", m.Source, s)
	}
	if m.Label != "" {
		s = fmt.Sprintf("%v:%v", s, m.Label)
		if len(m.Params) > 0 {
			s = fmt.Sprintf("%v(%v)", s, m.Params)
		}
	}
	return s
}
